package org.pps.gl.server.datastore;

import java.util.List;
import com.google.appengine.api.datastore.Entity;
import com.google.appengine.api.datastore.FetchOptions;
import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.KeyFactory;
import com.google.appengine.api.datastore.Query;
import com.google.appengine.api.datastore.Query.FilterOperator;

/**
 * Cette classe prend en charge toutes les operations en rapport avec l'entitée
 * Experience.
 * 
 * Une Experience a les propriétés suivantes : - emailUser - poste - période -
 * direction - domaine - description
 * 
 */
public class Experience_Pro {

	/**
	 * 
	 * Créer une nouvelle experience pour un utilisateur.
	 * 
	 * @param emailUser
	 *            : email de l'utilisateur concerné.
	 * @param periode
	 *            : Période de temps pour cette expérience pro.
	 * @return la nouvelle entité crée.
	 */
	public static Entity createExperience(String emailUser, String periode,
			String direction, String poste, String description, String domaine) {

		Entity experience = new Entity("Experience");
		experience.setProperty("email_user", emailUser);
		experience.setProperty("periode", periode);
		experience.setProperty("direction", direction);
		experience.setProperty("poste", poste);
		experience.setProperty("description", description);
		experience.setProperty("domaine", domaine);

		Util.persistEntity(experience);
		return experience;

	}

	/**
	 * Récupère toutes les experiences d'un utilisateur.
	 * 
	 * @param emailUser
	 *            : email de l'utilisateur concerné.
	 * @return: toutes les expériences pour l'utilisateur.
	 */
	public static Iterable<Entity> getExperienceForUser(String emailUser) {
		Query query = new Query("Experience");
		query.addFilter("email_user", FilterOperator.EQUAL, emailUser);
		List<Entity> results = Util.getDatastoreServiceInstance()
				.prepare(query).asList(FetchOptions.Builder.withDefaults());
		if (!results.isEmpty()) {
			return results;
		}
		return null;
	}

	/**
	 * Efface l'experience d'un utilisateur.
	 * 
	 * @param entity
	 *            : Entité Experience à effacer.
	 */
	public static String deleteExperience(long id) {
		Key key = KeyFactory.createKey("Experience", id);
		Entity exp = Util.findEntity(key);
		if (key != null) {
			Entreprise.deleteEntreprise(Entreprise.getEntreprise(exp));
			Util.deleteEntity(key);
			return ("Expérience supprimée.");
		} else
			return ("Expérience introuvable.");
	}
	
	/**
	 * Efface l'experience d'un utilisateur.
	 * 
	 * @param entity
	 *            : Entité Experience à effacer.
	 */
	public static String deleteExperience(Entity exp) {
		Key key = exp.getKey();
		
		if (key != null) {
			Entreprise.deleteEntreprise(Entreprise.getEntreprise(exp));
			Util.deleteEntity(key);
			return ("Expérience supprimée.");
		} else
			return ("Expérience introuvable.");
	}

	/**
	 * Récupère la période pour une entité Experience.
	 * 
	 * @param experience
	 *            entity.
	 * @return
	 */
	public static String getPeriodeExperience(Entity experience) {
		return (String) experience.getProperty("periode");
	}

	/**
	 * Récupère la direction pour une entité Experience.
	 * 
	 * @param experience
	 *            entity.
	 * @return
	 */
	public static String getDirection(Entity experience) {
		return (String) experience.getProperty("direction");
	}

	/**
	 * Récupère le poste pour une entité Experience.
	 * 
	 * @param experience
	 *            entity.
	 * @return
	 */
	public static String getPoste(Entity experience) {
		return (String) experience.getProperty("poste");
	}

	/**
	 * Récupère la description pour une entité Experience.
	 * 
	 * @param experience
	 *            entity.
	 * @return
	 */
	public static String getDescription(Entity experience) {
		return (String) experience.getProperty("description");
	}

	/**
	 * Récupère le domaine d'activité pour une entité Experience.
	 * 
	 * @param experience
	 *            entity.
	 * @return
	 */
	public static String getDomaine(Entity experience) {
		return (String) experience.getProperty("domaine");
	}
	
	/**
	 * Retourne l'id correspondant à une experience.
	 * @return
	 */
	public static long getIdExperience(Entity experience){
		return experience.getKey().getId();
	}
	
	/**
	 * Parcours de toutes les expériences entre les deux utilisateurs
	 * pour retourner le score de l'expérience la plus intéressante
	 */
	public static double getScoreExperience(String emailUser1, String emailUser2){
		double score=0, scoreMax=0;
		Iterable<Entity> exps1 = Experience_Pro.getExperienceForUser(emailUser1);
		Iterable<Entity> exps2 = Experience_Pro.getExperienceForUser(emailUser2);
		if(exps1==null || exps2==null) return 0;
		for(Entity e1 : exps1){
			for(Entity e2 : exps2){
				if(Entreprise.getEntreprise(e1)!=null && Entreprise.getEntreprise(e2)!=null)
				if(Entreprise.getEntreprise(e1).getProperty("nom").toString().equals(Entreprise.getEntreprise(e2).getProperty("nom").toString())){
					score = 0.3;
					String[] p1 = e1.getProperty("periode").toString().split("-");
					String[] p2 = e2.getProperty("periode").toString().split("-");
					if(p1[1].equals("en cours")){
						if(p2[1].equals("en cours")) score = 0.8;
						else if(Integer.parseInt(p1[0]) > Integer.parseInt(p2[1]) ) score = 0.8;
					} else {
						if(p2[1].equals("en cours")) {
							if(Integer.parseInt(p1[1]) < Integer.parseInt(p2[0]) ) score = 0.8;
						}
						else if(Integer.parseInt(p1[1]) < Integer.parseInt(p2[0]) || Integer.parseInt(p1[0]) > Integer.parseInt(p2[1]) ) score = 0.8;
					}
					if (e1.getProperty("domaine").equals(e2.getProperty("Domaine")))
						if (score == 0.8)
							score = 1;
						else
							score = 0.7;
				}
				else if (e1.getProperty("domaine").equals(e2.getProperty("Domaine")))
					score = 0.1;
				// fin de l'affectation du score, on veut le maximum
				if (score > scoreMax)
					scoreMax = score;
			}
		}
		return scoreMax;
	}

}
